package xyz.icxl.kotlion.ext.collection

import android.os.Build
import kotlin.streams.toList

/**
 *
 * 文件描述：@{line java.util.Collection}扩展
 *
 * 文件创建人：cxl
 *
 * 创建时间：2021 年 11月 22 日
 *
 * 文件版本：v1.0
 *
 * 版本描述：创建文件
 */

/**
 * 数组大小
 *
 * 如果Collection为null则返回0
 * 否则返回真实的大小
 */
val Collection<*>?.sizeOrZero: Int
    get() = this?.size ?: 0


/**
 * 寻找元素在集合中的位置
 * @param eq 使用者需实现该函数，该函数返回元素直接的对比结果，true比对成功
 * @return 不存在集合中返回-1 存在则返回具体的下标
 */
fun <T> Collection<T>.findPosition(eq: (T) -> Boolean): Int {
    forEachIndexed { index, t ->
        if (eq(t)) {
            return index
        }
    }
    return -1
}

/**
 * 根据规则过滤数组
 * @param eq 使用者需实现该函数，该函数返回元素直接的对比结果，true比对成功
 * @return 返回新的过滤后的数组
 */
inline fun <T>Collection<T>.filter(eq:(T)->Boolean):MutableList<T>{
    val list = ArrayList<T>()
    forEach {
        if (eq(it))
            list.add(it)
    }
    return list
}

/**
 * 根据条件[eq]移除某个元素
 *
 * @return 元素移除成功返回[true] 否则返回 [false]
 */
inline fun <T>MutableList<T>.remove(eq:(T)->Boolean):Boolean{
    var oldPosition = -1
    this.forEachIndexed { index, t ->
        if (eq(t)) {
            oldPosition = index
            return@forEachIndexed
        }
    }
    if (oldPosition!=-1){
        this.removeAt(oldPosition)
        return true
    }
    return false
}

/**
 * 内容转换
 */
inline fun <I,O>MutableList<I>.covert(covert:(I)->O):MutableList<O>{
    val list = ArrayList<O>()
    forEach {
        list.add(covert(it))
    }
    return list
}